#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "ui_mainwindow.h"
#include <QCloseEvent>
#include <QListWidgetItem>
#include <QFile>
#include <QDirModel>
#include <QStringListModel>
#include <QToolButton>
#include <QStandardItemModel>
#include <QStandardItem>
#include <iostream>
#include <QApplication>
#include <QSettings>
#include <QtDebug>
#include <QStringList>
#include <QFileDialog>
#include <QTextStream>
#include <QMessageBox>
#include <QFont>
#include <QFontDialog>
#include <QScreen>
#include <QTextBlock>
#include <QLineEdit>
#include <QScrollBar>
#include <QProcess>
#include "selectdata.h"
#include "codeeditor.h"
#include "qscieditor.h"
#include "widgetutils.h"
#include "layoututils.h"
#include "settingmanage.h"
#include "myutils.h"
#include "fileutils.h"
#include "settingsdialog.h"
#include "textsearchdialog.h"
#include "aboutdialog.h"

QT_BEGIN_NAMESPACE
namespace Ui{ class MainWindow; }

QT_END_NAMESPACE

class MainWindow: public QMainWindow
{
Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void applySetting();

protected:
    void closeEvent(QCloseEvent *e) override;
    void moveEvent(QMoveEvent *event) override;   // 捕获窗口移动事件
    void resizeEvent(QResizeEvent *event) override; // 捕获窗口大小变化事件

    void changeEvent(QEvent *event) override; // 重写 changeEvent 方法

private slots:
    void on_list1_itemSelectionChanged();//切换目录
    void on_list2_itemSelectionChanged();//切换文件
    void on_list1_itemChanged(QListWidgetItem *item);//修改目录名
    void on_list2_itemChanged(QListWidgetItem *item);//修改文件名
    void on_textArea_textChanged();//文本内容修改
    void on_makeDir_clicked();//创建目录
    void on_makeFile_clicked();//创建文件
    //切换当前选择的行，修改Item颜色
    void on_list2_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous);
    void on_list1_customContextMenuRequested(const QPoint &pos);//目录右键
    void on_list2_customContextMenuRequested(const QPoint &pos);//文件右键

    void newDocument();
    void open();
    void save();
    void saveAsAct();
    void copy();
    void cut();
    void paste();
    void undo();
    void redo();
    void selectFont();
    void exit();
    void on_actionJumpToTopButton_triggered();//跳转到顶部
    void on_actionJumpToBottomButton_triggered();//跳转到底部
    void showDir();
    void showFile();
    void deleteDir();
    void deleteFile();
    void upper();//转换大写
    void lower();//转换小写
    void moveSelectedLinesUp();//向上移动一行
    void moveSelectedLinesDown();//向下移动一行
    void showAboutDialog();  // 显示“关于”对话框

private:
    Ui::MainWindow *ui;
    QSettings *settings;
    SettingsDialog *m_settingsDialog = nullptr;
    TextSearchDialog *m_textSearchDialog = nullptr;
    QString rootPath;
    QString list1Path;
    QString list2Path;
    QString list1Value;
    QString list2Value;
    QListWidget *list1;
    QListWidget *list2;
    CodeEditor *m_textArea;
    QsciEditor *m_frame;
    QMenu *popMenu_L;
    QMenu *popMenu_R;
    SettingManage *settingManage;
    int textAreaType;//0 = QPlainTextEdit,1 = qscieditor
    bool isClearList2;//程序修文件列表时候为true
    bool isClearTextArea;//程序修改文本内容时候为true
    bool isSave;//是否保存
    bool isDarkTheme = true;//是否暗黑主题
    QString defaultTextColorName;//默认列表字体颜色
    QString otherFile;//打开的其他文件名

    QPoint oldPos;
    QSize oldSize;

private:
    void initialize();
    void setthemeColor();
    void setDarkTheme(bool enabled);
    void updateTextFont(QFont font);//更新textArea字体
    void showExplorer(QString path);
    void makeFile();
    void makeDir();
    void showList2();//更新list2列表数据
    void showFileText();//打开list2文件
    void cleanTextArea();// 清空TextArea
    void setTextArea(QString text);// 添加TextArea文本
    QString getTextArea();// 获取TextArea文本
    void saveAs(QString defaultName);

    void setSelectColor();
};
#endif // MAINWINDOW_H
